/**
 * <pre>
 * OOoO0OOoO0OOOooo0oOOOO0OOOOO0oooOO0ooOOO0Ooooo0OOOOo0ooooO0OOooo0Ooooo0OOOOO
 *  Java 中的 POJO、VO、DTO、DO、BO、PO、Entity 等说明
 * OOoO0OOoO0OOOooo0oOOOO0OOOOO0oooOO0ooOOO0Ooooo0OOOOo0ooooO0OOooo0Ooooo0OOOOO
 * </pre>
 *
 * @author 山野羡民（1032694760@qq.com）
 * @since 2025/04/08
 */
package cn.iocoder.yudao.framework.business.basic.pojo;

//POJO (Plain Old Java Object)
//含义：符合 JavaBean 规范的简单对象。VO、DTO、DO、BO、PO、Entity 等本质上都是 POJO 的子集或变体，根据用途和场景附加了不同职责。
//特点：
//必须是非抽象的公共类。
//提供无参构造函数（可隐式）。
//属性通过 getter/setter 方法访问。
//不依赖任何框架或特定技术，可跨框架复用。
//可自由组合为 VO、DTO、DO、BO、PO、Entity 等角色。
//VO (View Object)
//含义：视图对象。
//分层：Controller 层
//职责：封装前端需要的字段（如分页信息 total、rows），可能聚合多个业务对象的数据、与数据库结构解耦。
//用途：Controller 层返回给前端的响应数据
//DTO (Data Transfer Object)
//含义：数据传输对象。
//分层：Service 与 Service 之间、API 层
//职责：仅传输必要的接口参数，减少 HTTP 或 RPC 的网络开销，避免暴露内部实体对象（如隐藏敏感字段）。
//用途：接口请求参数传递、跨微服务通信
//DO (Domain Object)
//含义：领域对象
//分层：Service 层
//职责：代表业务实体，与数据库表结构可能一致，包含完整业务字段及业务逻辑（如 computeTotal()）
//用途：核心业务处理。
//BO (Business Object)
//含义：业务对象
//分层：Service 层
//职责：封装复杂业务规则，间接映射数据库
//用途：包含复杂业务逻辑（如订单计算、权限校验），聚合多个 DO 或 PO 的数据，映射数据库表中不存在的字段（如 commentCount）。
//PO (Persistent Object)
//含义：持久化对象
//分层：DAO 层
//职责：直接映射数据库表，字段与数据库表字段一一对应（如 JPA 的 @Column 注解）
//用途：MyBatis 或 JPA 等 ORM 框架中的实体类
//Entity (实体类)
//含义：ORM 框架中的持久化实体。
//分层：DAO 层
//职责：直接映射数据库表，字段与数据库表字段一一对应（如 MyBatis-Plus 的 @TableName、@TableField 注解）
//用途：MyBatis 或 JPA 等 ORM 框架中的实体类，部分项目可能将其等同于 DO 或 PO。
//Model (模型类)
//含义：模型对象，通常泛指业务层的数据模型
//分层：视项目而定
//职责：通用数据模型，灵活定义（作为展示层对象类似 VO、作为业务对象类似 BO 或 DO、作为传输对象类似 DTO）。
//用途：常见于框架或项目未严格分层时的通用命名，如 Spring MVC 中 Model 对象用于向视图传递数据。
//
//本项目分为 Controller、API、Service、DAO 四层，采用 VO、DTO、BO、Entity，其中的 Entity 等同于 DO 及 PO。以下是基于 VO、DTO、Entity 结合 SpringBoot + MyBatis-Plus + MapStruct 实现一个简单用户管理功能的完整示例，分层设计如下：
//1. 实体类（Entity）
//直接映射数据库表，由 MyBatis-Plus 管理：
//@Data
//@TableName("user")
//public class UserEntity {
//    @TableId(type = IdType.AUTO)
//    private Long id;
//    private String username;
//    private String email;
//    private Integer age;
//    @TableField(fill = FieldFill.INSERT)
//    private LocalDateTime createTime;
//}
//2. 数据传输对象（DTO）
//用于接口参数传递，封装请求参数：
//@Data
//public class UserDTO {
//    private Long id;
//    private String username;
//    private String email;
//    private Integer age;
//}
//3. 视图对象（VO）
//用于返回前端展示数据，可包含分页信息：
//@Data
//public class UserVO {
//    private Long id;
//    private String username;
//    private String email;
//    private Integer age;
//   // 分页信息（可选）
//    private Integer pageNum;
//    private Integer pageSize;
//    private Long total;
//}
//4. Mapper 接口
//继承 MyBatis-Plus 的 BaseMapper：
//public interface UserMapper extends BaseMapper<UserEntity> {
//   // 可添加自定义 SQL（如复杂查询）
//}
//5. Service 层
//实现业务逻辑，转换 DTO ↔ Entity：
//@Service
//public class UserService extends ServiceImpl<UserMapper, UserEntity> {
//
//    @Autowired
//    private UserMapper userMapper;
//
//   // 新增用户
//    public void createUser(UserDTO dto) {
//        UserEntity entity = UserConvert.INSTANCE.dtoToEntity(dto);
//        save(entity);
//    }
//
//   // 更新用户
//    public void updateUser(UserDTO dto) {
//        UserEntity entity = UserConvert.INSTANCE.dtoToEntity(dto);
//        updateById(entity);
//    }
//
//   // 根据ID查询
//    public UserVO getUserById(Long id) {
//        UserEntity entity = getById(id);
//        return UserConvert.INSTANCE.entityToVO(entity);
//    }
//
//   // 分页查询
//    public Page<UserVO> listUsers(int pageNum, int pageSize) {
//        Page<UserEntity> page = new Page<>(pageNum, pageSize);
//        Page<UserEntity> result = page(page, Wrappers.<UserEntity>lambdaQuery());
//        return result.convert(UserConvert.INSTANCE::entityToVO);
//    }
//}
//6. 转换类（Convert）
//使用 MapStruct 自动转换对象：
//@Mapper
//public interface UserConvert {
//    UserConvert INSTANCE = Mappers.getMapper(UserConvert.class);
//
//   // DTO → Entity
//    @Mapping(target = "id", source = "id")
//    @Mapping(target = "username", source = "username")
//    @Mapping(target = "email", source = "email")
//    @Mapping(target = "age", source = "age")
//    UserEntity dtoToEntity(UserDTO dto);
//
//   // Entity → VO
//    @Mapping(target = "id", source = "id")
//    @Mapping(target = "username", source = "username")
//    @Mapping(target = "email", source = "email")
//    @Mapping(target = "age", source = "age")
//    UserVO entityToVO(UserEntity entity);
//}
//7. Controller 层
//接收请求 DTO 并返回 VO：
//@RestController
//@RequestMapping("/users")
//public class UserController {
//
//    @Autowired
//    private UserService userService;
//
//   // 创建用户
//    @PostMapping
//    public void create(@RequestBody UserDTO dto) {
//        userService.createUser(dto);
//    }
//
//   // 更新用户
//    @PutMapping
//    public void update(@RequestBody UserDTO dto) {
//        userService.updateUser(dto);
//    }
//
//   // 根据ID查询
//    @GetMapping("/{id}")
//    public UserVO get(@PathVariable Long id) {
//        return userService.getUserById(id);
//    }
//
//   // 分页查询
//    @GetMapping
//    public Page<UserVO> list(
//            @RequestParam int pageNum,
//            @RequestParam int pageSize) {
//        return userService.listUsers(pageNum, pageSize);
//    }
//}
//8. API 层
//直接调用 Service 层进行数据组装：
//实现业务逻辑，转换 DTO ↔ Entity：
//public interface UserApi {
//
//   // 根据ID查询
//    UserVO getUserById(Long id);
//
//   // 分页查询
//    Page<UserVO> listUsers(int pageNum, int pageSize);
//
//}
//@Service
//public class UserServiceImpl implements UserApi {
//
//    @Autowired
//    private UserService userService;
//
//    @Override
//    public UserVO getUserById(Long id) {
//        return userService.getUserById(id);
//    }
//
//    @Override
//    public Page<UserVO> listUsers(int pageNum, int pageSize) {
//        return userService.listUsers(pageNum, pageSize);
//    }
//}
